﻿CREATE PROCEDURE [dbo].[LedgerTransTypesUpdate]
(--типы проводок для экспорта в 1С
	@Name varchar(100),
	@DebitLedgerAccountId int,
	@DebitSubcontoTypeId1 int,
	@DebitSubcontoTypeId2 int,
	@DebitSubcontoTypeId3 int,
	@DebitSubcontoTypeId4 int,
	@DebitSubcontoTypeId5 int,
	@CreditLedgerAccountId int,
	@CreditSubcontoTypeId1 int,
	@CreditSubcontoTypeId2 int,
	@CreditSubcontoTypeId3 int,
	@CreditSubcontoTypeId4 int,
	@CreditSubcontoTypeId5 int,
	@Note varchar(250),
	@MD datetime,
	@MW varchar(50),
	@ToDelete bit,
	@Original_Id int,
	@Original_MD datetime
)
AS
DECLARE @orgName varchar(100), @orgToDelete bit, @orgParentToDelete bit
DECLARE @strMsg nvarchar(500), @intRet int, @intErrCode int

SET NOCOUNT ON

IF (@Name Is Null) OR (@DebitLedgerAccountId Is Null) OR (@CreditLedgerAccountId Is Null)
OR (@ToDelete Is Null)
BEGIN
	SELECT @intErrCode = 1, @strMsg = 'Неправильные параметры в вызове процедуры ' + Object_Name(@@Procid) + ' !'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

IF (ltrim(@Name) = '')
BEGIN
	SELECT @intErrCode = 2, @strMsg = 'Незаполнено наименование!'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

SELECT @orgName = Name, @orgToDelete = ToDelete
FROM [CO].[LedgerTransTypes] WHERE Id = @Original_Id AND MD = @Original_MD
IF (@@rowcount <> 1)
BEGIN
	SELECT @intErrCode = 3, 
	@strMsg = 'Данные изменены после последнего запроса!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

IF @orgName <> @Name
BEGIN
	IF EXISTS (SELECT TOP 1 ID FROM [CO].[LedgerTransTypes] WHERE Name = @Name AND ToDelete = 0) 
	BEGIN
		SELECT @intErrCode = 4, @strMsg = 'Дублируется наименование!'
		RAISERROR (@strMsg, 11, @intErrCode)
		RETURN @intErrCode
	END
END

IF @DebitSubcontoTypeId1 Is Null SET @DebitSubcontoTypeId1 = 1
IF @DebitSubcontoTypeId2 Is Null SET @DebitSubcontoTypeId2 = 1
IF @DebitSubcontoTypeId3 Is Null SET @DebitSubcontoTypeId3 = 1
IF @DebitSubcontoTypeId4 Is Null SET @DebitSubcontoTypeId4 = 1
IF @DebitSubcontoTypeId5 Is Null SET @DebitSubcontoTypeId5 = 1

IF @CreditSubcontoTypeId1 Is Null SET @CreditSubcontoTypeId1 = 1
IF @CreditSubcontoTypeId2 Is Null SET @CreditSubcontoTypeId2 = 1
IF @CreditSubcontoTypeId3 Is Null SET @CreditSubcontoTypeId3 = 1
IF @CreditSubcontoTypeId4 Is Null SET @CreditSubcontoTypeId4 = 1
IF @CreditSubcontoTypeId5 Is Null SET @CreditSubcontoTypeId5 = 1

SELECT @orgParentToDelete = ToDelete
FROM CO.LedgerAccounts WHERE Id = @DebitLedgerAccountId
IF (@@rowcount <> 1)
BEGIN
	SELECT @intErrCode = 5, 
	@strMsg = 'Отсутствует родительская запись с кодом ' + cast(@DebitLedgerAccountId as varchar(20)) + ' в справочнике счетов!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END
IF @orgParentToDelete = 1 
BEGIN
	SELECT @intErrCode = 6, 
	@strMsg = 'Родительская запись с кодом ' + cast(@DebitLedgerAccountId as varchar(20)) + ' в справочнике счетов отмечена для удаления!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

SELECT @orgParentToDelete = ToDelete
FROM CO.LedgerSubcontoTypes WHERE Id = @DebitSubcontoTypeId1
IF (@@rowcount <> 1)
BEGIN
	SELECT @intErrCode = 7, 
	@strMsg = 'Отсутствует родительская запись с кодом ' + cast(@DebitSubcontoTypeId1 as varchar(20)) + ' в справочнике субконто!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END
IF @orgParentToDelete = 1 
BEGIN
	SELECT @intErrCode = 8, 
	@strMsg = 'Родительская запись с кодом ' + cast(@DebitSubcontoTypeId1 as varchar(20)) + ' в справочнике субконто отмечена для удаления!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

SELECT @orgParentToDelete = ToDelete
FROM CO.LedgerSubcontoTypes WHERE Id = @DebitSubcontoTypeId2
IF (@@rowcount <> 1)
BEGIN
	SELECT @intErrCode = 9, 
	@strMsg = 'Отсутствует родительская запись с кодом ' + cast(@DebitSubcontoTypeId2 as varchar(20)) + ' в справочнике субконто!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END
IF @orgParentToDelete = 1 
BEGIN
	SELECT @intErrCode = 10, 
	@strMsg = 'Родительская запись с кодом ' + cast(@DebitSubcontoTypeId2 as varchar(20)) + ' в справочнике субконто отмечена для удаления!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

SELECT @orgParentToDelete = ToDelete
FROM CO.LedgerSubcontoTypes WHERE Id = @DebitSubcontoTypeId3
IF (@@rowcount <> 1)
BEGIN
	SELECT @intErrCode = 11, 
	@strMsg = 'Отсутствует родительская запись с кодом ' + cast(@DebitSubcontoTypeId3 as varchar(20)) + ' в справочнике субконто!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END
IF @orgParentToDelete = 1 
BEGIN
	SELECT @intErrCode = 12, 
	@strMsg = 'Родительская запись с кодом ' + cast(@DebitSubcontoTypeId3 as varchar(20)) + ' в справочнике субконто отмечена для удаления!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

SELECT @orgParentToDelete = ToDelete
FROM CO.LedgerSubcontoTypes WHERE Id = @DebitSubcontoTypeId4
IF (@@rowcount <> 1)
BEGIN
	SELECT @intErrCode = 13, 
	@strMsg = 'Отсутствует родительская запись с кодом ' + cast(@DebitSubcontoTypeId4 as varchar(20)) + ' в справочнике субконто!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END
IF @orgParentToDelete = 1 
BEGIN
	SELECT @intErrCode = 14, 
	@strMsg = 'Родительская запись с кодом ' + cast(@DebitSubcontoTypeId4 as varchar(20)) + ' в справочнике субконто отмечена для удаления!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

SELECT @orgParentToDelete = ToDelete
FROM CO.LedgerSubcontoTypes WHERE Id = @DebitSubcontoTypeId5
IF (@@rowcount <> 1)
BEGIN
	SELECT @intErrCode = 15, 
	@strMsg = 'Отсутствует родительская запись с кодом ' + cast(@DebitSubcontoTypeId5 as varchar(20)) + ' в справочнике субконто!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END
IF @orgParentToDelete = 1 
BEGIN
	SELECT @intErrCode = 16, 
	@strMsg = 'Родительская запись с кодом ' + cast(@DebitSubcontoTypeId5 as varchar(20)) + ' в справочнике субконто отмечена для удаления!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

SELECT @orgParentToDelete = ToDelete
FROM CO.LedgerAccounts WHERE Id = @CreditLedgerAccountId
IF (@@rowcount <> 1)
BEGIN
	SELECT @intErrCode = 17, 
	@strMsg = 'Отсутствует родительская запись с кодом ' + cast(@CreditLedgerAccountId as varchar(20)) + ' в справочнике счетов!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END
IF @orgParentToDelete = 1 
BEGIN
	SELECT @intErrCode = 18, 
	@strMsg = 'Родительская запись с кодом ' + cast(@CreditLedgerAccountId as varchar(20)) + ' в справочнике счетов отмечена для удаления!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

SELECT @orgParentToDelete = ToDelete
FROM CO.LedgerSubcontoTypes WHERE Id = @CreditSubcontoTypeId1
IF (@@rowcount <> 1)
BEGIN
	SELECT @intErrCode = 19, 
	@strMsg = 'Отсутствует родительская запись с кодом ' + cast(@CreditSubcontoTypeId1 as varchar(20)) + ' в справочнике субконто!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END
IF @orgParentToDelete = 1 
BEGIN
	SELECT @intErrCode = 20, 
	@strMsg = 'Родительская запись с кодом ' + cast(@CreditSubcontoTypeId1 as varchar(20)) + ' в справочнике субконто отмечена для удаления!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

SELECT @orgParentToDelete = ToDelete
FROM CO.LedgerSubcontoTypes WHERE Id = @CreditSubcontoTypeId2
IF (@@rowcount <> 1)
BEGIN
	SELECT @intErrCode = 21, 
	@strMsg = 'Отсутствует родительская запись с кодом ' + cast(@CreditSubcontoTypeId2 as varchar(20)) + ' в справочнике субконто!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END
IF @orgParentToDelete = 1 
BEGIN
	SELECT @intErrCode = 22, 
	@strMsg = 'Родительская запись с кодом ' + cast(@CreditSubcontoTypeId2 as varchar(20)) + ' в справочнике субконто отмечена для удаления!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

SELECT @orgParentToDelete = ToDelete
FROM CO.LedgerSubcontoTypes WHERE Id = @CreditSubcontoTypeId3
IF (@@rowcount <> 1)
BEGIN
	SELECT @intErrCode = 23, 
	@strMsg = 'Отсутствует родительская запись с кодом ' + cast(@CreditSubcontoTypeId3 as varchar(20)) + ' в справочнике субконто!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END
IF @orgParentToDelete = 1 
BEGIN
	SELECT @intErrCode = 24, 
	@strMsg = 'Родительская запись с кодом ' + cast(@CreditSubcontoTypeId3 as varchar(20)) + ' в справочнике субконто отмечена для удаления!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

SELECT @orgParentToDelete = ToDelete
FROM CO.LedgerSubcontoTypes WHERE Id = @CreditSubcontoTypeId4
IF (@@rowcount <> 1)
BEGIN
	SELECT @intErrCode = 25, 
	@strMsg = 'Отсутствует родительская запись с кодом ' + cast(@CreditSubcontoTypeId4 as varchar(20)) + ' в справочнике субконто!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END
IF @orgParentToDelete = 1 
BEGIN
	SELECT @intErrCode = 26, 
	@strMsg = 'Родительская запись с кодом ' + cast(@CreditSubcontoTypeId4 as varchar(20)) + ' в справочнике субконто отмечена для удаления!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

SELECT @orgParentToDelete = ToDelete
FROM CO.LedgerSubcontoTypes WHERE Id = @CreditSubcontoTypeId5
IF (@@rowcount <> 1)
BEGIN
	SELECT @intErrCode = 27, 
	@strMsg = 'Отсутствует родительская запись с кодом ' + cast(@CreditSubcontoTypeId5 as varchar(20)) + ' в справочнике субконто!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END
IF @orgParentToDelete = 1 
BEGIN
	SELECT @intErrCode = 28, 
	@strMsg = 'Родительская запись с кодом ' + cast(@CreditSubcontoTypeId5 as varchar(20)) + ' в справочнике субконто отмечена для удаления!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

IF @orgToDelete = 1 --Запись была отмечена для удаления
BEGIN
	IF @ToDelete = 1 
	BEGIN
		SELECT @intErrCode = 29, 
		@strMsg = 'Нельзя редактировать запись, отмеченную для удаления!'
		RAISERROR (@strMsg, 11, 1)
		RETURN @intErrCode
	END
END ELSE BEGIN
	IF @ToDelete = 1 
	BEGIN
		SELECT @intErrCode = 30, 
		@strMsg = 'Для удаления данных должна использоваться другая процедура!'
		RAISERROR (@strMsg, 11, 1)
		RETURN @intErrCode
	END
END

EXEC [dbo].[ProcessStatistic] @Note OUTPUT, @MD OUTPUT, @MW OUTPUT

	SET NOCOUNT OFF;

UPDATE [CO].[LedgerTransTypes] SET [Name] = @Name, 
[DebitLedgerAccountId] = @DebitLedgerAccountId,
[DebitSubcontoTypeId1] = @DebitSubcontoTypeId1,
[DebitSubcontoTypeId2] = @DebitSubcontoTypeId2,
[DebitSubcontoTypeId3] = @DebitSubcontoTypeId3,
[DebitSubcontoTypeId4] = @DebitSubcontoTypeId4,
[DebitSubcontoTypeId5] = @DebitSubcontoTypeId5,
[CreditLedgerAccountId] = @CreditLedgerAccountId,
[CreditSubcontoTypeId1] = @CreditSubcontoTypeId1,
[CreditSubcontoTypeId2] = @CreditSubcontoTypeId2,
[CreditSubcontoTypeId3] = @CreditSubcontoTypeId3,
[CreditSubcontoTypeId4] = @CreditSubcontoTypeId4,
[CreditSubcontoTypeId5] = @CreditSubcontoTypeId5,
[Note] = @Note, [MD] = @MD, [MW] = @MW, ToDelete = @ToDelete 
WHERE Id = @Original_Id AND MD = @Original_MD;

SELECT Id, [Name],
[DebitLedgerAccountId],[DebitSubcontoTypeId1],[DebitSubcontoTypeId2],[DebitSubcontoTypeId3],[DebitSubcontoTypeId4],[DebitSubcontoTypeId5],
[CreditLedgerAccountId],[CreditSubcontoTypeId1],[CreditSubcontoTypeId2],[CreditSubcontoTypeId3],[CreditSubcontoTypeId4],[CreditSubcontoTypeId5],
Note, MD, MW, ToDelete 
FROM [CO].[LedgerTransTypes] WHERE Id = @Original_Id

RETURN 0